#ifndef _DEVICE_FUNCTION_H_
#define _DEVICE_FUNCTION_H_

#include "zf_common_headfile.h"
#include "device_imageProcess.h"
#include "class_thread_wrapper.h"
/**************舵机功能：变量和函数声明-->start**********************/
#define STEER_LEFT  6400  //舵机左拐
#define STEER_MID    5700  //舵机归中
#define STEER_RIGHT   5000  //舵机右拐
uint16 limit_servo_pwm(uint16_t pwm,uint16_t pwm_Mix,uint16_t pwm_Max);//舵机限幅函数
int16 PD_Camera(float expect_val, float err,float P_argv,float D_argv);
extern uint16 target_servo;




/*******************出库任务：变量+函数-->start**************************/
typedef enum{
    goStraight, //直行
    rightTurn    //左拐
}outBoundTaskState;//小车任务状态
extern uint8 outBoundFinishedFlag;
extern outBoundTaskState myOutBoundTaskState;
void outBoundfunction();
/*******************出库任务：变量+函数-->end**************************/

/*******************侧方停车任务：变量+函数-->start**************************/
//侧方停车开始标志位
extern bool sideParkingFinishedFlag;

typedef enum {
    PARKING_READY,          // 准备状态（靠边）
    PARKING_REVERSE_RIGHT,  // 右打死倒退
    PARKING_REVERSE_STRAIGHT, // 回正倒退
    PARKING_REVERSE_LEFT,   // 左打死倒退
    PARKING_FORWARD_LEFT,   // 左打死前进
    PARKING_FORWARD_STRAIGHT, // 回正前进
    PARKING_FORWARD_RIGHT,  // 右打死前进
    PARKING_COMPLETED       // 停车完成
}sideParkingTask;//小车任务
/*******************侧方停车任务：变量+函数-->end**************************/


extern bool radarEntryFlag; //雷达入口flag
typedef enum{
    radarLeft,//雷达入口左拐
    radarGo, //雷达入口直行
    radarStart //雷达入口开始
}radarEntry;//小车任务

/*******************全局任务：变量+函数-->start**************************/// 
typedef enum{
    outBoundState,//出库任务
    followLineState,//巡线任务
    sideParkingState,//侧方停车任务
    radarState //雷达任务开始状态
}carTask;//小车任务
extern carTask mycarTask;
void carOverallTask(void);//小车全局任务
/*******************全局任务：变量+函数-->end**************************/

/*
不同赛道PID种类
*/
typedef enum{
    offCruiseState, //关闭默认巡航状态
    onCruiseState, //打开默认巡航状态
    acceleratedCruiseState    //加速巡航状态
}carCruiseTask;//小车巡航状态

/*
宏定义表明：节约时间，提高效率
参数：  
    状态为0：关闭默认巡航
    状态为1：开启默认巡航
    状态为2：加速巡航
*/
#define followLineTask(flag) \
    ((void)((flag) == 0 ? servoDirectionControl(offCruiseState): \
           ((flag) == 1 ? servoDirectionControl(onCruiseState) : \
           ((flag) == 2 ? servoDirectionControl(acceleratedCruiseState) : (void)0))))


extern carCruiseTask myCarCruiseTask;
void servoDirectionControl(carCruiseTask myCarCruiseTask);//舵机方向控制函数
extern bool isAccelerate;//是否加速
#endif